# coding=utf-8
import re
import codecs
class Para(object):
    """
    整个程序的基础参数
    以类变量形式存储在这里
    """
    # 参数文件默认位置
    # 可以自行在初始化时指定
    para_file_path = "E:\\temp\\rs\\para.txt"

    # --------------------------工作目录----------------------------
    # 项目文件存储根目录
    root = "E:\\sun2\\工作\\python\\rs_label\\rs_label"
    # 项目临时文件存储目录
    tmp = "E:\\temp\\rs\\tmp"

    # ---------------------------数据库-----------------------------
    # 数据库类型
    db_type = "sqlite3"
    # 数据库存储地址
    # 使用sqlite数据库，存储地址为*.db文件
    db_name = "e:\\temp\\rs\\db\\rs_label.db"

    # ---------------------------聚类-------------------------------
    # K-means中参数k
    k = 5

    # ---------------------社交媒体照片数据库检索---------------------
    # 数据库粗糙检索差值参数
    e = 0.001
    # 精确距离检索参数，单位为km
    ed = 0.2

    # 测试属性
    test_attr = 0

    def __init__(self, para_file_path):
        """
        读取参数文件，初始化参数
        :param para_file_path:参数文件位置
        """

        with codecs.open(para_file_path, "r", "utf-8") as f:
            # 如果是空行或者#开头的注释行，则跳过
            for line in list(filter(lambda l: l.strip() != "" and l.strip()[0] != '#', f.readlines())):
                line = line.strip()
                # 去除分割之后多余的空格和空字符
                splits = list(filter(lambda s: s != ' ' and s != '', line.split(" ")))
                # 如果参数赋值语句不是 A=B 的格式，就不进行处理
                if len(splits) != 3 or splits[1] != '=':
                    continue
                # print(len(splits), splits)
                # 动态添加属性
                # 暂且支持属性为int，float和str类型

                int_re = re.compile("[0-9]+")
                float_re = re.compile("[0-9]+\.[0-9]+")
                re1 = int_re.match(splits[2])
                re2 = float_re.match(splits[2])

                if re1 is not None and len(re1.group(0)) == len(splits[2]):
                    # 属性为int类型
                    setattr(self, splits[0], int(splits[2]))
                elif re2 is not None and len(re2.group(0)) == len(splits[2]):
                    # 属性为float类型
                    setattr(self, splits[0], float(splits[2]))
                else:
                    # 属性为str类型
                    setattr(self, splits[0], splits[2])

    def get(self, attr_name):
        """
        从para实例中获取某个属性名称的函数
        :param attr_name: 属性名称
        :return: 如果实例该属性存在，则返回实例中属性值
                如果实例中属性不存在，但是类中有默认属性，则返回类中属性默认值
                如果该属性都不存在，返回None
        """
        if attr_name in dir(self):
            return getattr(self, attr_name)
        elif attr_name in dir(Para):
            return getattr(Para, attr_name)
        else:
            return None

def main():
    """
    测试函数
    :return:
    """
    # para_file_path = "E:\\temp\\rs\\para.txt"
    para_file_path = "/usr/data/remote_sensing/crowdsourcing_label/tmp/para.config"
    para = Para(para_file_path)
    print(dir(para))
    print(para.get("k"))
    print(para.get("test_attr"))
    print(para.get("no_attr"))


if __name__ == "__main__":
    main()